package com.beantools.execption;

import static com.beantools.constants.SingleChar.BLANK_OP;
import static com.beantools.constants.SingleChar.SIGN_COLON_OP;
import static com.beantools.util.ObjectUtil.isNull;

/**
 * 这个是向外抛出的类异常信息
 *
 * @author baoya
 * @version 1.1.0
 * @since 1.0
 */

public class ClassException extends RuntimeException {

    /**
     * 表示特定的类字面常量，如果调用者传递该类，
     * 获取该类的类路径，用于指明是哪个类出现了错误
     */
    private Class<?> persistentClazz;

    /**
     * 抛出的异常信息，比如属性名nAme的第二字母不能大写
     */
    private String message;

    /**
     * 实例化异常的构造器，其有两个参数，{@code message}需要抛出具体的异常信息;
     *
     * @param message 抛出的异常信息
     * @since 1.1.0
     */
    public ClassException(String message) {
        super(message);
        this.message = message;
    }

    /**
     * 实例化异常的构造器，其有两个参数，{@code message}需要抛出具体的异常信息;
     * {@code persistentClazz}是当前类字面常量
     *
     * @param message         抛出的异常信息
     * @param persistentClazz 调用者传递的类字面常量
     * @since 1.1.0
     */
    public ClassException(String message, Class<?> persistentClazz) {
        super(message);
        this.message = message;
        this.persistentClazz = persistentClazz;

    }

    /**
     * 重写父类的方getMessage()法，返回自定义的错误信息。首先，属性名不能为空
     * 否则，就抛出空指针异常。如果当前类的类字面常量不为空，则抛出了异常，比如：
     *
     * @return message 错误信息
     */
    @Override
    public String getMessage() {
//        if (isNull(persistentClazz)) {
//            throw new NullPointerException("当前类字面常量不能为空");
//        }
        String var = isNull(persistentClazz) ? ("类" + persistentClazz.getName() + "的") : "";
        return "异常信息" + var + SIGN_COLON_OP + BLANK_OP + this.message;
    }
}
